package 设计模式;

/**
 * @author shy_black
 * @date 2019/3/9 19:40
 * @Description:
 */
/**
 * 代理模式_饿汉式
 */
class Person_1 {
    private final static Person_1 shy_black = new Person_1();

    private Person_1(){
    }

    public static Person_1 getInstance() {
        return shy_black;
    }
}

//public class 单例模式 {
//    public static void main(String[] args) {
//        Person_1 shy_black_1 = Person_1.getInstance();
//        Person_1 shy_white_1 = Person_1.getInstance();
//
//        System.out.println(shy_black_1);
//        System.out.println(shy_white_1);
//    }
//}
//输出结果
//test.Person_1@1540e19d
//test.Person_1@1540e19d



//在创建对象和返回实例化对象时使用static修饰的目的是在类加载时就完成初始化，避免在类的外部无创建类对象。


//懒汉式单例模式与饿汉式单例模式的区别在于懒汉式会先判断是否已经存在实例化对象，如果存在，直接返回已存在的对象，如果不存在，则创建对象，再返回。在判断和创建这里可能会有线程安全问题，我们需要用double_check来解决。


/**
 * 代理模式，，懒汉式
 */
class Person {
    private volatile static Person shy_black = null;

    private Person() {
    }
    public static Person getInstance() {

        //double_chack,防止因为线程问题而出现多个类对象

        if (shy_black == null)
            synchronized (Person.class) {
                if(shy_black == null)
                    shy_black = new Person();
            }
        return shy_black;
    }
}

public class 单例模式 {
    public static void main(String[] args) {
        Person shy_black = Person.getInstance();
        Person shy_white = Person.getInstance();

        System.out.println(shy_black);
        System.out.println(shy_white);
    }

}
